#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<sys/types.h>
#include<vector>
#include<string>
#include<cstdlib>

const int threadnum=5;

class Task
{
public:
    Task(int a,int b)
        :_a(a)
        ,_b(b)
    {}

    int excute()
    {
        std::cout<<_a<<'+'<<_b<<"=";
        return _a+_b;
    }
private:
    int _a;
    int _b;
};

class ThreadData
{
public:
    ThreadData(const std::string&threadname,int a,int b)
        :_threadname(threadname)
        ,_task(a,b)
    {}
    const std::string& threadname()
    {
        return _threadname;
    }
    int running()
    {
        return _task.excute();
    }
private:
    std::string _threadname;
    Task _task;
};



void* threadTask(void*arg)
{
    ThreadData*t=(ThreadData*)arg;
    std::cout<<t->threadname()<<" ";
    std::cout<<t->running()<<std::endl;
    delete t;
    return nullptr;
}

int main()
{
    std::vector<pthread_t>thread;
    srand(time(nullptr));
    for(int i=0;i<threadnum;i++)
    {
        pthread_t id;
        std::string name("thread");
        name+=i;
        int x=rand()%5;
        int y=rand()%5;
        ThreadData*data=new ThreadData(name,x,y);
        pthread_create(&id,nullptr,threadTask,data);
        thread.push_back(id);
    }
    for(pthread_t id:thread)
    {
        pthread_join(id,nullptr);
    }
    return 0;
}

// void* task(void*arg)
// {
//     char*threadname=(char*)arg;
//     std::cout<<threadname<<std::endl;
//     delete[] threadname;
//     return nullptr;
// }

// int main()
// {
//     for(int i=0;i<5;i++)
//     {
//         pthread_t id;
//         //char buffer[64]; 在栈上定义的变量所有的线程都可以进行修改
//         char*buffer=new char[64];
//         snprintf(buffer,64,"thread:%d",i);
//         pthread_create(&id,nullptr,task,buffer);
//         pthread_join(id,nullptr);
//     }
//     std::cout<<"主线程退出"<<std::endl;
//     return 0;
// }

// int g_val=0;

// //线程共有进程中的资源
// void* threadl(void*arg)
// {
//     int cnt=0;
//     int a=10;
//     //a/=0;一旦有一个线程出异常，整个进程都会退出
//     while(cnt<5)
//     {
//         printf("new thread:%ld g_val:%d &g_val:%p\n",pthread_self(),g_val,&g_val);
//         g_val++;
//         sleep(1);
//         cnt++;
//     }
//     return (void*)"running success";   
// }

// int main()
// {
//     pthread_t id=0;
//     pthread_create(&id,nullptr,threadl,nullptr);
//     int cnt=0;
//     while(cnt<5)
//     {
//         printf("main thread:%ld g_val:%d &g_val:%p\n",pthread_self(),g_val,&g_val);
//         sleep(1);
//         cnt++;
//     }
//     return 0;
// }

// void* func(void*args)
// {
//     int cnt=0;
//     while(cnt<5)
//     {
//         std::cout<<"当前是新线程 pid:"<<getpid()<<std::endl;
//         sleep(1);
//         cnt++;
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t id=0;
//     int ret=pthread_create(&id,nullptr,&func,nullptr);
//     std::cout<<id<<std::endl;
//     int cnt=0;
//     while(cnt<10)
//     {
//         std::cout<<"当前是主线程 pid:"<<getpid()<<std::endl;
//         sleep(1);
//         cnt++;
//     }
//     return 0;
// }